package top.atcra.rpc.protection.circuitBreaker;

import java.util.concurrent.CompletableFuture;

public abstract class CircuitBreaker {
    public enum State {
        CLOSED,  // 熔断器关闭
        OPEN,    // 熔断器开启
        HALF_OPEN // 半开状态，可以放行一个请求，根据请求结果决定后续关闭还是开放
    }

    protected State state = State.CLOSED;

    /**
     * 获取当前断路器的状态
     *
     * @return State
     */
    public abstract State getState();

    /**
     * 在一定延迟后，将熔断器设置为HALF_OPEN状态
     * @param currentTime 当前时间戳，单位：毫秒
     * @param delay_ms 延迟时间，单位：毫秒
     */
    public abstract void delayReset(long currentTime, int delay_ms);

    /**
     * 记录调用结果，用于更新熔断器状态
     * 若熔断器为半开状态时，本次请求执行失败则打开熔断器，反之关闭熔断器
     * @param callFuture 调用结果
     */
    public abstract void logCallResult(CompletableFuture<?> callFuture);

}
